#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget

from sqlalchemy.orm import eagerload


from scp.modelo.models import DBSession
from scp.modelo.Usuario import Usuario
from scp.modelo.Rol import Rol
from scp.modelo.Permiso import Permiso
from scp.modelo.Proyecto import Proyecto
from scp.modelo.Fase import Fase
from scp.modelo.Usuario import Usuario
from scp.modelo.Recurso import Recurso
from scp.modelo.AsignacionRecurso import AsignacionRecurso

from pyramid.security import authenticated_userid

from pyramid.response import Response
from pyramid.view import view_config
import json

import re

#@view_config(renderer='json')
def desarrolloProyecto(request):
	"""Método controlador encargado de la administración de los itmes.
		URL asociada: /items/{operacion}
		operacion:
			traerItems: retorna los items de un determinado proyecto
		@param request: Petición Http del cliente. 	
	"""


	print ">>>>>>>>>>>>>Controlador de Roles - Inicio>>>>>>>>>>>>>>"
	print "request:"
	print request

	print 'metodo:'
	
	methodRequest = request.method
	print methodRequest
	
	print 'request.url:'
	
	print request.url
	
	
	dicParametros = request.matchdict
	
		
	print "parametros abajo..."
	print request.params
	
	print 'request.body'
	print request.body 
	

	print "operación"
	print dicParametros.get('operacion')
	print "operación"
	
	session = DBSession()
	if dicParametros.get('operacion') == 'desarrollar' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	
	if dicParametros.get('operacion') == 'traerItems':
		proyecto = session.query(Proyecto).filter_by(id=request.params['idProyecto']).first()
		
		fases = proyecto.fases
		itemsJson = []
		for fase in fases:
			print ">>>entre en el for.."
			itemsFase = fase.items
			if len(itemsFase) == 0:
				print ">>>entre en el if donde no tiene items"
				aux = { 'nombreItem': 'La fase no contiene items!', 'nombreFase':fase.nombre}
				itemsJson.append(aux)
			else:
				for item in itemsFase:
					aux = {'nombreItem': item.nombre, 'nombreFase':fase.nombre}	
					itemsJson.append(aux)
		
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, items = itemsJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView 
	
	
	if dicParametros.get('operacion') == 'traerFases':
		proyecto = session.query(Proyecto).filter_by(id=request.params['idProyecto']).first()
		
		fases = proyecto.fases
		itemsJson = []
		
		"""for fase in fases:
			print ">>>entre en el for.."
			itemsFase = fase.items
			if len(itemsFase) == 0:
				print ">>>entre en el if donde no tiene items"
				aux = { 'nombreItem': 'La fase no contiene items!', 'nombreFase':fase.nombre}
				itemsJson.append(aux)
			else:
				for item in itemsFase:
					aux = {'nombreItem': item.nombre, 'nombreFase':fase.nombre}	
					itemsJson.append(aux)"""
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		
		
		
		fasesJson = []
		for fase in fases:
			mostrarTabItems = puedeTabRelaciones(usuarioLogeado, fase.id)
			aux = {'nombreFase': fase.nombre, 'idFase': fase.id, 'descripcionFase': fase.descripcion, 
			'fechaIniFase': fase.fecha_inicio, 'fechaFinFase': fase.fecha_fin, 'mostrarTabItems':mostrarTabItems, 'ordenFase':fase.orden}
			fasesJson.append(aux)
			
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, fases = fasesJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
	
	
	
	
	
	
	
	if dicParametros.get('operacion') == 'viewTipoItems':
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, tiposItems = [{'idTipoItem':'1', 'nombreTipoItem': 'Caso de Uso'}, {'idTipoItem':'2', 'nombreTipoItem': 'Requerimiento Funcional'}]))
		#responseView.body = json.dumps(dict(success = True, roles = rolesArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
	
	
	if dicParametros.get('operacion') == 'traerAtributos':
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		#responseView.body = json.dumps(dict(success = True, roles = rolesArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
	
	
	
	if dicParametros.get('operacion') == 'update' or dicParametros.get('operacion') == 'create':
		
		
		print 'json.loads(request.params[rol])'
		rol = json.loads(request.params['rol'])
		print json.loads(request.params['rol'])
		print 'rol.data'
		rolData = rol.get('data')
		print rol.get('data')
		print 'rol.data.nombreRol'
		print rolData.get('nombreRol')
		print 'json.loads(request.params[ids_permisos])'
		permisos = json.loads(request.params['ids_permisos'])
		print permisos
	
	print 'dicParametros.get(operacion).find(?):' 
	print dicParametros.get('operacion').find('?')
	
	session = DBSession()
	if dicParametros.get('operacion') == 'view' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	elif dicParametros.get('operacion') == 'view':
		rolesAll = session.query(Rol).all()
		
		print '>>rolesAll'
		print rolesAll
		
		rolesArray = []
		for rolIter in rolesAll:
			aux = {'idRol': rolIter.id, 'nombreRol': rolIter.nombre, 'descripRol':rolIter.descripcion}
			rolesArray.append(aux)
		
		print '>>rolesArray'
		print rolesArray
			
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, roles = [{'idRol':'1', 'nombreRol': 'hola', 'descripRol':'mundo'}, {'idRol':'2', 'nombreRol': 'chau', 'descripRol':'mundo'}]))
		responseView.body = json.dumps(dict(success = True, roles = rolesArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
	elif dicParametros.get('operacion') == 'create':
		
		rolExiste = session.query(Rol).filter_by(nombre=rolData.get('nombreRol')).first()
		
		if rolExiste == None:
			rol = Rol()
			rol.nombre = rolData.get('nombreRol')
			rol.descripcion = rolData.get('descripRol')
			
			permisosArray = []
			
			for idPermiso in permisos:
				permiso = session.query(Permiso).filter_by(id=idPermiso).first()
				permisosArray.append(permiso)
			
					
			rol.permisos =  permisosArray
			session.add(rol)	
		
			responseCreate = Response()
			responseCreate.body = json.dumps(dict(success = True, rsp='ok', msg = 'Rol Creado Exitosamente!'))
			responseCreate.content_type = 'application/json'
		else:
			
			responseCreate = Response()
			responseCreate.body = json.dumps(dict(success = True, rsp='er', msg = 'Rol ya existe!'))
			responseCreate.content_type = 'application/json'	
		
		return responseCreate	
	
	
	elif dicParametros.get('operacion') == 'update':
		#rolEditar = session.query(Rol).filter_by(id=rolData.get('idRol')).first()
		rolEditar = session.query(Rol).options(eagerload('permisos')).filter_by(id=rolData.get('idRol')).one() 
		#permisosNoAnda = session.query(Rol.permisos).filter_by(id=rolData.get('idRol')).all()
		
		print '>>>rolEditar'
		print rolEditar
		
		print '>>>rolEditar.permisos'
		print rolEditar.permisos
		
		
		print '>>>rolEditar.nombre'
		print rolEditar.nombre
		
		#print 'permisosNoAnda'
		#print permisosNoAnda
		
		rolEditar.nombre = rolData.get('nombreRol')
		
		print '>>>rolData.get(descripRol)'
		print rolData.get('descripRol')
		
		rolEditar.descripcion = rolData.get('descripRol')
		
		idsPermisosEditar = json.loads(request.params['ids_permisos'])
		
		print '>>>idsPermisosEditar'
		print idsPermisosEditar
		
		permisosArray = []
		
		for idPermiso in idsPermisosEditar:
			print '>>idPermiso en el ciclo!!'
			print idPermiso
			permiso = session.query(Permiso).filter_by(id=idPermiso).first()
			permisosArray.append(permiso)
		
		
		
		rolEditar.permisos = permisosArray
		
		responseUpdate = Response()
		responseUpdate.body = json.dumps(dict(success = True))
		responseUpdate.content_type = 'application/json'
		return responseUpdate	
	elif dicParametros.get('operacion') == 'destroy':
		print 'entre en el if de update'
		
		idRolEliminar = json.loads(request.params['param_idRol'])
		rolEliminar = session.query(Rol).filter_by(id=idRolEliminar).first()
		
		session.delete(rolEliminar)
		
		responseDestroy = Response()
		responseDestroy.body = json.dumps(dict(success = True))
		responseDestroy.content_type = 'application/json'
		return responseDestroy	

def puedeTabRelaciones(usuarioLogeado, faseID):
		
		session = DBSession()
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		#usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		faseID = faseID #request.params['idFase']
		
		#traemos el recurso
		recurso = session.query(Recurso).filter_by( fase_id = faseID, tipo = 'F' ).one()
	
		asignacionesRecurso = session.query(AsignacionRecurso).filter_by( recurso_id = recurso.id, usuario_id = usuarioLogeado.id ).all()
		
		#construimos el JSON que enviaremos
		respuesta = False
		done = False
		for asignacion in asignacionesRecurso:
			if done == True:
				break
			rolAsigncion = asignacion.rol											
			for permisoIter in rolAsigncion.permisos:
				#autorizacionesJson[permisoIter.nombre] = False		
				if permisoIter.nombre == 'VER_ITEM':
					respuesta = True
					done = True
					break
				
		return respuesta
 
